<?xml version = '1.0' encoding = 'UTF-8'?>
<HBRRepo><variables><variable name="OQP_Version" type="member" usage="const" id="1" product="Planning"><property name="application">SalesPln</property><property name="dimensionInputMode">type</property><property name="dimensionType">Version</property><property name="prompt_text">LABEL_QTP_SLS_PLAN_PRMPT_VERSION</property><property name="scope">ruleset</property><property name="seeded">true</property><value/></variable><variable name="OQP_Year" type="member" usage="const" id="2" product="Planning"><property name="application">SalesPln</property><property name="dimension">Years</property><property name="dimensionInputMode">name</property><property name="prompt_text">LABEL_QTP_SLS_PLAN_PRMPT_YEAR</property><property name="scope">ruleset</property><property name="seeded">true</property><value/></variable></variables><rulesets/><rules><rule id="1" name="OQP_Set Predictive as Target" product="Planning"><property name="application">SalesPln</property><property name="plantype">OEP_QTP</property><property name="seeded">true</property><variable_references><variable_reference name="OQP_Version" id="1"><property name="application">SalesPln</property><property name="hidden">true</property><property name="rule_name">OQP_Set Predictive as Target</property><property name="seq">1</property><property name="type">3</property><property name="useAsOverrideValue">false</property><property name="validation_value">"OEP_Working"</property></variable_reference><variable_reference name="OQP_Year" id="2"><property name="application">SalesPln</property><property name="hidden">true</property><property name="rule_name">OQP_Set Predictive as Target</property><property name="seq">2</property><property name="type">3</property><property name="useAsOverrideValue">false</property><property name="validation_value">"No Year"</property></variable_reference></variable_references><script type="groovy">			/*RTPS:{OQP_Version} {OQP_Year}*/			
            /*PURPOSE: This rule sets predictive Quota as Target Quota.*/
			String Version=rtps.OQP_Version.member.name;			
			String Year=rtps.OQP_Year.member.name;
			List&lt;String> CustomRelDimensions=[];
			List&lt;String> CustomDimMembers=[];
			List&lt;String> CustomDimensions=[];
			boolean isDataModified = false;
            boolean isUnitsModel=false;
			boolean isMbrPrdictValue=false;
			String strRowDim;
			String strColDim;
			String strColDimName;
            String driverDimMember;
            String predictDimMember;
            String ScenarioName;
            String mbrPredict;
            String strPredictCrossDim;
			List&lt;String> ColumnDimensions =[];
			List&lt;String> RowDimensions =[];
			List&lt;String> NewColumnDims =[];
			String strCrossDim = "";
			/*Evalute if Quota planning model is enabled for units or  Amount */
            	Application app=operation.getApplication();
				Cube qtp=operation.getCube(); 
				Dimension dim=app.getDimension(DimensionType.ACCOUNT,qtp);
                 if (dim.hasMember("OQP_Units",qtp)==true)
                    {
                     		isUnitsModel=true;
                            driverDimMember="OQP_Last Year Units";
                            mbrPredict="OQP_Predicted Units";
                    }
                    else
                    {
                  		  isUnitsModel=false;
                          driverDimMember="OQP_Last Year Revenue";
                          mbrPredict="OQP_Predicted Revenue";
                    }
                    
            /*Identify POV Dimensoins and their members*/
			def grid=operation.grid;
			List&lt;DataGrid.HeaderCell> hcells=grid.getPov()
            hcells.each{
				def dimName = it.getDimName();
				String mbrName=it.getMbrName();
				if (!mbrName.equals(Version) &amp;&amp; !it.getDimensionType().equals(DimensionType.SIMPLE_CURRENCY)  &amp;&amp; !mbrName.equals(Year))
				{
					CustomRelDimensions.add('''@Relative("'''+mbrName+'''",0)''');
					CustomDimMembers.add('''"'''+mbrName+'''"''')
					strCrossDim= strCrossDim + "\""+ mbrName+"\"->"
					CustomDimensions.add('''"'''+dimName+'''"''');
				}
			
            }			
			StringBuilder cscript = new StringBuilder();
			/*Identify Row Dimensions*/
			List&lt;DataGrid.Row> rows = grid.getRows()
			for (DataGrid.Row row : rows) 
			{
				List&lt;DataGrid.HeaderCell> subRows = row.getHeaders();
				for(DataGrid.HeaderCell cell : subRows) 
				  {
					String memName = cell.getDimName();  
				  if (!RowDimensions.contains(memName))
				   {
						RowDimensions.add(memName)      	 
				   }     	 
				 }        
			}
            /*Identify Column Dimensions*/
			List&lt;List&lt;DataGrid.HeaderCell>> cols = grid.getColumns();
			for (List&lt;DataGrid.HeaderCell> cells : cols) 
			{
			 
				for (DataGrid.HeaderCell cell : cells)  
				  {
				   String memName = cell.getMbrName();
				   String dimName = cell.getDimName();
                   String dimType = cell.getDimensionType();
				   if (!ColumnDimensions.contains(dimName))
					  {
						if (memName.equals("YearTotal") || memName.equals(driverDimMember) || dimType.equals("Scenario")  )
						{
							ColumnDimensions.add(dimName)
                            if (dimType.equals("Scenario"))
                            {
                            	ScenarioName=memName;
                            }
						}
						else
						{
						 if(!NewColumnDims.contains(dimName))	
								{
									NewColumnDims.add(dimName)
									strColDimName=dimName;
								}
						}
				   
					 }   	
				 }
						   
			 }
			 grid.dataCellIterator(mbrPredict).each
              	{   
                	isMbrPrdictValue=true;
				}
            	
             /*START : Generate Calculation Script  - Main Fix*/
			cscript.append('''SET AGGMISSG ON;\n''');
			cscript.append('''SET UPDATECALC OFF;\n''');
			cscript.append('''FIX("'''+ Year +'''"''')
			cscript.append (''',"'''+Version+'''"''')			
            cscript.append (''',"'''+ScenarioName+'''"''')			
			if (app.getCurrencyMode()!=CurrencyMode.SINGLE_CURRENCY)
			 {
				String sCurrency =  operation.grid.pov.find { it.dimName == 'Currency' }.essbaseMbrName 
                //cscript.append (''',"'''+app.getDefaultCurrency()+'''"''')
                cscript.append (''',"'''+ sCurrency +'''"''')
			 }
			
			if (RowDimensions.size()==1)
			{
				strRowDim='''OEP_All '''+RowDimensions[0]
			}	

			if (NewColumnDims.size() == 1)
			{
            	strColDim="OEP_All " + strColDimName
			}
			
			if (strRowDim!=null)
			{
			
				strCrossDim= strCrossDim + "\""+ strRowDim+"\"->"
			}
			if (strColDim!=null)
			{
				strCrossDim= strCrossDim + "\"OEP_Total "+strColDimName+"\"->"
			}

			strPredictCrossDim= strCrossDim+'''"'''+mbrPredict+'''"'''
            strCrossDim= strCrossDim+'''"'''+driverDimMember+'''"->"Yeartotal"'''
            
            cscript.append (''',@ICHILDREN("'''+strRowDim+'''"))\n''')
			/*Setting predictive Quota as Target Quota*/
			cscript.append('''	FIX(@Relative("Yeartotal",0)''')
			if (strColDim!=null)
			{
				cscript.append(''',@Relative("'''+strColDim+'''",0)''')
			}
             if (CustomDimMembers.size()>0)
            {
				cscript.append(''','''+CustomRelDimensions.join(''','''))
            }
          
			cscript.append(''')\n''')
			cscript.append('''			"OQP_Target Quota" \n''')
			cscript.append('''			( \n''')
			cscript.append('''				"OQP_Target Quota" = '''+strPredictCrossDim+''' * ("'''+driverDimMember+'''"->"Yeartotal"/'''+strCrossDim+''');\n''')
			cscript.append('''				"OQP_Allocated Target Quota" = "OQP_Target Quota"; \n''')
			cscript.append('''			) \n''')
			cscript.append('''	ENDFIX; \n''')        
            /*Aggregate Custom Dimensions*/
            if (CustomDimMembers.size()>0)
            {
				cscript.append('''	FIX(''')
				cscript.append ('''"OQP_Allocated Target Quota","OQP_Target Quota")\n''')				
				cscript.append('''		AGG(''')
				cscript.append (CustomDimensions.join(''','''))				
				if (strColDimName!=null)
				{
					cscript.append(''',"'''+strColDimName+'''"''')
				}
				cscript.append (''');\n''')
				cscript.append('''	ENDFIX; \n''')
            }
            else
            {
           	 if (strColDimName!=null)
				{
                	cscript.append('''	FIX(''')
					cscript.append ('''"OQP_Allocated Target Quota","OQP_Target Quota")\n''')					
					cscript.append('''		AGG(''')
					cscript.append('''"'''+strColDimName+'''"''')				
					cscript.append (''');\n''')
                	cscript.append('''	ENDFIX; \n''')
            	}
            }           
            /*Calulate Growth% percentage*/
              cscript.append('''	FIX(''')              
              if(CustomDimMembers.size()>0)
              {
              cscript.append (CustomDimMembers.join(''','''))
              }
              if (strColDim!=null)
              {
              	if (CustomDimMembers.size()>0)
              	{
              		cscript.append(''','''+'''@ICHILDREN("'''+strColDim+'''")''')
               	}
                else
                {
                	cscript.append('''@ICHILDREN("'''+strColDim+'''")''')
                }
              }
              cscript.append(''')\n''')
              cscript.append('''		"OQP_Growth%"''')
              cscript.append('''		( \n''')
              cscript.append('''			"OQP_Growth%"  = (("OQP_Target Quota"->"YearTotal"-"'''+driverDimMember+'''"->"YearTotal")/ "'''+driverDimMember+'''"->"YearTotal");\n''')
              cscript.append('''		) \n''')
              cscript.append('''	ENDFIX; \n''')
			  cscript.append('''ENDFIX; \n''')
            if (isMbrPrdictValue==false)
                {                
                	/*throwVetoException(new HspRuntimeException("MSG_QTP_PREDICT_VALIDATION")) ;              */
					println("Please perform predictive planning before set targets.")
                }
                else
                {
                	println (cscript.toString())	
            		return cscript.toString()    
				}									
			</script></rule></rules><components/><deployobjects><deployobject product="2" application="salespln" plantype="oep_qtp" obj_id="1" obj_type="1" name="OQP_SET PREDICTIVE AS TARGET"/></deployobjects></HBRRepo>